// src/main/preload.js

const { contextBridge, ipcRenderer } = require('electron')
const fs = require('fs');
const path = require('path');

// === API ===
console.log('[preload] contextBridge exposing electronAPI...')

contextBridge.exposeInMainWorld('electronAPI', {
    /**
     * 调用主进程的 'start-training' 事件
     * @param {object} trainingConfig - 训练配置参数
     * @returns {Promise<any>} 主进程返回的结果
     */
    startTraining: (trainingConfig) => {
        console.log('[preload] 调用 startTraining', trainingConfig)
        return ipcRenderer.invoke('start-training', trainingConfig)
    },

    /**
    * 调用主进程打开文件选择对话框
    * @returns {Promise<string[]>} 用户选择的图片文件路径数组
    */
    openImageDialog: () => {
        console.log('[preload] 调用 openImageDialog')
        return ipcRenderer.invoke('dialog:openImage')
    },

    /**
     * 打开目录选择对话框
     * @returns {Promise<string>} 用户选择的目录路径
     */
    openDirectoryDialog: () => {
        console.log('[preload] 调用 openDirectoryDialog')
        return ipcRenderer.invoke('dialog:selectDirectory', '选择图片文件夹')
    },

    /**
    * 调用主进程打开目录选择对话框
    * @param {string} title - 对话框标题
    * @returns {Promise<string>} 用户选择的目录路径
    */
    selectDirectory: (title) => {
        console.log('[preload] 调用 selectDirectory', title)
        return ipcRenderer.invoke('dialog:selectDirectory', title)
    },

    /**
    * 导出标注数据
    * @param {Object} annotationData - 标注数据
    * @returns {Promise<string|null>} 保存的文件路径
    */
    exportAnnotations: (annotationData) => {
        console.log('[preload] 调用 exportAnnotations')
        return ipcRenderer.invoke('dialog:exportAnnotations', annotationData)
    },

    /**
    * 显示权限帮助信息
    * @returns {Promise<boolean>}
    */
    showPermissionHelp: () => {
        console.log('[preload] 调用 showPermissionHelp')
        return ipcRenderer.invoke('dialog:showPermissionHelp')
    },

    /**
    * 读取图片为base64
    */
    readImageAsBase64: (imgPath) => {
        try {
            const ext = path.extname(imgPath).slice(1).toLowerCase();
            const mime = ext === 'jpg' ? 'jpeg' : ext;
            const data = fs.readFileSync(imgPath);
            return `data:image/${mime};base64,${data.toString('base64')}`;
        } catch (e) {
            console.error('[preload] 读取图片为base64失败:', imgPath, e);
            return null;
        }
    },

    // === 项目管理相关 API ===

    /**
    * 初始化项目管理器
    * @param {string} workspaceDir - 工作目录路径
    * @returns {Promise<Object>} 初始化结果
    */
    initializeProjectManager: (workspaceDir) => {
        console.log('[preload] 调用 initializeProjectManager', workspaceDir)
        return ipcRenderer.invoke('project:initialize', workspaceDir)
    },

    /**
    * 创建新项目
    * @param {Object} projectData - 项目数据
    * @returns {Promise<Object>} 创建结果
    */
    createProject: (projectData) => {
        console.log('[preload] 调用 createProject', projectData)
        return ipcRenderer.invoke('project:create', projectData)
    },

    /**
    * 加载项目
    * @param {string} projectPath - 项目路径
    * @returns {Promise<Object>} 项目配置
    */
    loadProject: (projectPath) => {
        console.log('[preload] 调用 loadProject', projectPath)
        return ipcRenderer.invoke('project:load', projectPath)
    },

    /**
    * 保存项目
    * @param {Object} projectConfig - 项目配置
    * @returns {Promise<Object>} 保存结果
    */
    saveProject: (projectConfig) => {
        console.log('[preload] 调用 saveProject')
        return ipcRenderer.invoke('project:save', projectConfig)
    },

    /**
    * 获取最近项目列表
    * @returns {Promise<Object>} 最近项目列表
    */
    getRecentProjects: () => {
        console.log('[preload] 调用 getRecentProjects')
        return ipcRenderer.invoke('project:getRecent')
    },

    /**
    * 获取本地方法配置
    * @returns {Promise<Object>} 方法配置数据
    */
    getLocalMethods: () => {
        console.log('[preload] 调用 getLocalMethods')
        return ipcRenderer.invoke('project:getLocalMethods')
    },

    /**
    * 删除项目
    * @param {string} projectPath - 项目路径
    * @returns {Promise<Object>} 删除结果
    */
    deleteProject: (projectPath) => {
        console.log('[preload] 调用 deleteProject', projectPath)
        return ipcRenderer.invoke('project:delete', projectPath)
    },

    /**
    * 导入图像到项目
    * @param {string} projectPath - 项目路径
    * @param {Array} imagePaths - 图像文件路径数组
    * @returns {Promise<Object>} 导入结果
    */
    importImagesToProject: (projectPath, imagePaths) => {
        console.log('[preload] 调用 importImagesToProject')
        return ipcRenderer.invoke('project:importImages', projectPath, imagePaths)
    },

    /**
     * 获取本地图片的base64数据
     * @param {string} imagePath - 图片路径
     * @returns {Promise<Object>} 图片数据
     */
    getLocalImageData: (imagePath) => {
        console.log('[preload] 调用 getLocalImageData', imagePath)
        return ipcRenderer.invoke('system:getLocalImageData', imagePath)
    },

    /**
     * 保存缩略图文件
     * @param {string} projectPath - 项目路径
     * @param {string} fileName - 文件名
     * @param {string} base64Data - base64图片数据
     * @returns {Promise<Object>} 保存结果
     */
    saveThumbnail: (projectPath, fileName, base64Data) => {
        console.log('[preload] 调用 saveThumbnail', fileName)
        return ipcRenderer.invoke('system:saveThumbnail', projectPath, fileName, base64Data)
    },

    /**
     * 删除缩略图文件
     * @param {string} projectPath - 项目路径
     * @param {string} fileName - 文件名
     * @returns {Promise<Object>} 删除结果
     */
    deleteThumbnail: (projectPath, fileName) => {
        console.log('[preload] 调用 deleteThumbnail', fileName)
        return ipcRenderer.invoke('system:deleteThumbnail', projectPath, fileName)
    },

    /**
     * 获取图片尺寸信息
     * @param {string} imagePath - 图片路径
     * @returns {Promise<Object>} 图片尺寸信息
     */
    getImageDimensions: (imagePath) => {
        console.log('[preload] 调用 getImageDimensions', imagePath)
        return ipcRenderer.invoke('system:getImageDimensions', imagePath)
    },

    /**
     * 获取文件夹中的所有图片文件
     * @param {string} folderPath - 文件夹路径
     * @returns {Promise<string[]>} 图片文件路径数组
     */
    getImagesFromFolder: (folderPath) => {
        console.log('[preload] 调用 getImagesFromFolder', folderPath)
        return ipcRenderer.invoke('system:getImagesFromFolder', folderPath)
    },

    /**
    * 打开文件夹
    * @param {string} folderPath - 文件夹路径
    * @returns {Promise<Object>} 操作结果
    */
    openFolder: (folderPath) => {
        console.log('[preload] 调用 openFolder', folderPath)
        return ipcRenderer.invoke('system:openFolder', folderPath)
    },

    /**
    * 打开文件对话框并选择项目文件
    * @returns {Promise<string[]>} 选择的项目文件路径
    */
    openFileDialog: (filters) => {
        console.log('[preload] 调用 openFileDialog', filters)
        return ipcRenderer.invoke('dialog:openFile', filters)
    },

    /**
     * 读取文件内容
     * @param {string} filePath - 文件路径
     * @returns {Promise<Object>} 文件内容
     */
    readFile: (filePath) => {
        console.log('[preload] 调用 readFile', filePath)
        return ipcRenderer.invoke('system:readFile', filePath)
    },
})

console.log('[preload] electronAPI 注入完成')